<?php
/**
 * 关于浮点数的精确度
 * 浮点数 存储最大正整数值2^53次方 16位 9007199254740992.0
 * 整数 存储最大正整数值2^64-1    19位 9223372036854775807
 */
$br = "<br/>\n";
$br2 = str_repeat($br, 2);


$arr[] = 9007199254740992.0; // 浮点数存储最大正整数值2^53次方 16位
$arr[] = 9007199254740993.0; //浮点数是溢出了,舍去了1
$arr[] = 9007199254740994.0;   //整数的浮点数溢出了,没有舍去,可以表示到
$arr[] = 9007199254740994;   //整数还没有溢出
$arr[] = PHP_INT_MAX;  // 整数存储最大正整数值
var_export($arr);

echo $br,"浮点数无论有多少尾数都不能被内部所使用的二进制精确表示，因此不能在不丢失一点点精度的情况下转换为二进制的格式。这就会造成混乱的结果",$br2;


$a = 0.3;
$b = 0.3;
$c = 0.5; //0.5是可以用二进制表示出来的

echo "计算过的数 使用var_export() 或者json_encode()才能看到真实存储表示:", $br2;
var_export([0.1,'0.3' => 0.3,'0.1+0.2' => 0.1+0.2,0.5,0.57]);

$a = 0.57*100;
$str = json_encode($a);
echo $br2;
var_dump($a, $str, var_export($str, 1), var_export($a, true),  json_decode($str));
echo $br2;
echo "使用var_export()验证 0.57*10: ",$a, var_export($a),var_export($str),var_export(json_decode($str)),$br;
echo $br2;
//$a = (1+3*4*0.03);
//$a = 5+4*28*0.1;
$a = 4*28*0.1;
$a = 4*28*(0.1*10)/10;
$a = 12*0.1;
$a = 112*0.1;
//$a = 124*0.03;
//$a = 1.36;
$str = json_encode($a);
var_dump($a, $str, json_decode($str));
echo "使用var_export()验证 112*0.1: ", var_export($a),var_export($str),var_export(json_decode($str)),$br;
$a = 0.03 * 12;
$a = 0.1+0.3;

echo $br2;
var_dump('102*0.1 != 10.2',102 * 0.1 > 10.2, 0.1+0.7 < 0.8);

echo $br,"浮点数比较/计算的不可靠行 加法/乘法运算", $br2;
echo "直接比较两个浮点数相等是 true", $br;
echo '0.3 == (0.1+0.2)为false 0.2 == (0.1+0.1)为true 0.4 == (0.1+0.3)为true', $br;
var_dump( "0.3 == 0.3 true",0.3 == 0.3);  //直接比较
var_dump( "0.3 == 0.3 true",$a == $b);
var_dump( "0.57 == 0.57 true",0.57 == 0.57);




var_dump(  '0.3 != (0.1+0.2) true',  0.3 != (0.1+0.2));
var_dump(  '0.3 == (0.1+0.2) false',  0.3 == (0.1+0.2));
var_dump(  '0.2 == (0.1+0.1) true', 0.2 == (0.1+0.1));
var_dump(  '0.2 != (0.1+0.1) false', 0.2 != (0.1+0.1));
var_dump( '0.4 == (0.1+0.3)', 0.4 == (0.1+0.3));
var_dump( '0.57*100 <> 57 true', 0.57*100 <> 57);
var_dump( '0.57*100 == 57 false', 0.57*100 == 57);
var_dump(  '0.02*100==2 true', 0.02*100==2);
var_dump(  '0.01*100==1 true', 0.01*100==1);
var_dump(  '0.1*10==1 true', 0.1*10==1);
var_dump(  '0.1*10!=1 false', 0.1*10!=1);

echo $br2,'intval(0.57*100)=56 $f显示的57 (int)$f 确是56',$br2;
$f = 0.57 * 100;
echo "var_export 可以看到变量的真实表示方式", var_export($f), $br;   //var_export 可以看到变量的真实表示方式
var_dump($f,(int)$f,intval($f));  //$f显示的57 (int)$f 确是56
$f = 0.57 * 1000;
var_export($f);
var_dump($f ,(int)$f ,intval($f));  //全是570

echo $br2,"浮点数比较/计算的不可靠行2", $br2;

var_dump('0.03*100==3',0.03*100 ==3,0.57*1000 == 570);

echo $br2;

echo "浮点数计算丢失一点点精度的情况下",$br2;
$a = 0.1+0.7;
echo "floor — 舍去法取整,发现floor((0.1+0.7)*10)=7",$br2;
var_dump($a,$a*10,floor($a*10));
var_dump($a,bcadd(0.1,0.7,1));

$a = 0.7-0.1;
var_dump($a,$a==0.6); //此时是相等的





